#!/usr/bin/env python3
# -*- coding: utf-8 -*-

' 用于添加机器人功能'

__author__ = 'Lucky Xiong'

# 进场欢迎 、 礼物提醒、 入场提醒、  点播提醒、  语音播报、 礼物计数、 场控 、 图灵机器
# 礼物截图 ,  积分

# 语音识别，  关闭声音提醒， 开启声音。。。
import functools
import threading
import time

import emoji

from selenium.webdriver.support.wait import WebDriverWait

'''
✨🌸欢迎新进直播间小伙伴
      点歌请看背景歌单
      点关注即可点歌
喜欢点点关注❤️投喂下小礼物
一颗药丸💊也是爱哟🥰🐳🌸
——————————————
 累计送六块礼物可获得主播 
      可爱的粉丝牌子哟
'''


def synchronized(func):
    @functools.wraps(func)
    def wrapper(self, *args, **kwargs):
        with self.lock:
            return func(self, *args, **kwargs)

    return wrapper


# 蟹蟹老板 提前祝老板新年快乐 打麻将一直糊
# 斗地主把把俩王四个二
class robot:
    welcome = emoji.emojize(
        '✨欢迎新进直播间小伙伴 \n 点歌请看背景歌单\n点关注即可点歌\n喜欢点点关注:red_heart:️投喂下小礼物 \n '
        '一颗药丸💊也是爱哟:smiling_face_with_3_hearts::spouting_whale::cherry_blossom:\n——————————————\n累计送六块礼物可获得主播\n'
        '可爱的粉丝牌子哟')

    def __init__(self, driver,db,unkey,key):
        self.driver = driver
        self.lock = threading.Lock()
        self.db = db
        self.unkey = unkey
        self.key = key

        # 一直等待主播开播 ，也就是说页面上没有返回直播间首页 的超链接
        print('检查是否开播...')
        WebDriverWait(self.driver, timeout=3600 * 10).until_not(
            lambda x: x.find_element_by_xpath('//*[@id="RoomClose"]/div/a[2]'))
        print('主播已开播')
        self.inputext = driver.find_element_by_css_selector('#Chatroom > div.input-container > input')

        self.sendBtn = driver.find_element_by_css_selector('#Chatroom > div.input-container > button.btn.btn-send')

        self.joinNameXpath = '//*[@id="ChatBox"]/div[2]/div/div[3]'
        self.msgBoxXpath = '//*[@id="ChatBox"]/div/div'
        self.joins = {}  # 短期内加入的人。

        # 是否需要模拟休息？抓包之后是否也需要模拟sleep？
    def setDb(self,db):
        self.db = db
    @synchronized
    def send(self, str):
        # self.inputext.send_keys(str)
        # self.sendBtn.click()
        print('机器人发送弹幕 : %s' % str)

    def lookDanmu(self):
        print('机器人看到了：')
        father = self.driver.find_element_by_xpath('msgBoxXpath')
        father.find_element_by_css_selector('.message')

    '观察进入的人'

    def lookIn(self):
        # 该方法判断元素是否出现 , 第二个参数为等待时间
        '''WebDriverWait:这个类的运作流程就是，程序每过一段时间就检查一次，如果条件成立就执行下一步，如果条件不成立，继续等待，直到超过最大等待时间，抛出TimeoutException'''
        try:
            print('开始等待元素出现')
            WebDriverWait(self.driver, 10).until(lambda x: x.find_element_by_xpath(self.joinNameXpath))
            print(self.driver.find_element_by_xpath(self.joinNameXpath).text)
            who = self.driver.find_element_by_xpath(self.joinNameXpath).text
            print('获取dict', self.joins.get(who))
            # 判断是否已经欢迎
            print(self.joins)
            if self.joins.get(who) is None:
                print('123', threading.current_thread().name)
                msg = '欢迎进来的新宝贝，%s' % who
                self.send(self.welcome)
                self.send(msg)
                self.joins[who] = time.time()
            elif time.time() - self.joins.get(who) > 10:  # 大于10S后删除
                self.joins.pop(who)

        except Exception as e:
            print('前10s没有进入人')
            print(e)  # 打印所有异常到屏幕

    def route(self):
        print('连接库')
        # db = pickledb.load('ws.db', True)
        if not self.db.exists(self.unkey):
            list_=self.db.lcreate(self.unkey) # 创建未处理的json list
        '''分发任务'''
        print('~~~~~~~~~~进入路由~~~~~~~~~~~~~~')
        len = self.db.llen(self.key)
        print('长度为：', len)
        if len >= 1:
            # 取出并清除本次数据
            jsonObj = self.db.lpop(self.key, 0)
            print('本次获得的json: ', jsonObj)
            '''开始处理'''
            if 'event' in jsonObj:
                print('正常数据')
                event = jsonObj['event']
                type2 = jsonObj['type']
                if event == 'statistics':
                    if type2 == 'room':
                        '''更新房间数据'''
                        pass
                    else:
                        self.undeal(jsonObj)
                elif event == 'join_queue':
                    if type2 == 'member':
                        '''有人加入'''
                        self.lookIn2(jsonObj)
                    else:
                        self.undeal(jsonObj)
                elif event == 'followed':
                    if type2 == 'member':
                        '''有人关注'''
                        self.followed(jsonObj)
                    else:
                        self.undeal(jsonObj)
                elif event == 'send':
                    if type2 == 'gift':
                        '''送礼物'''
                        self.gift(jsonObj)
                    else:
                        self.undeal(jsonObj)
                elif event == 'creator':
                    '''尚不明确'''
            else:
                print('其他类型数据')
        else:
            print('进入下一轮')
            return False
    '连接百度语音API'

    '''第二代欢迎进入'''

    def lookIn2(self, json):
        users = json['queue']
        for user in users:
            name = user['username']
            titles = user['titles']  # 相应的身份
            noble = ''
            for title in titles:
                if title['type'] == 'noble':
                    # 如果是有身份的，欢迎词加上
                    noble = '✨ %s ✨' % title['name']
            welcome = '欢迎{}  {}  进入直播间~'.format(noble, name)
            self.send(welcome)
        print('欢迎一队列完毕')

    '''感谢关注'''

    def followed(self, json):
        userName = json['user']['username']
        msg = '感谢 {} 的关注✨✨'.format(userName)
        self.send(msg)

    '''礼物感谢'''

    def gift(self, json):
        userName = json['user']['username']
        giftName = json['gift']['name']
        giftLevel = json['gift']['gift_id']
        msg = ''
        if giftLevel > 5:
            msg = '感谢 {} 的 {} ✨✨ ✨✨ 非常感谢您对主播的支持~'.format(userName, giftName)
        else:
            msg = '感谢 {} 的{}✨ 谢谢支持~'.format(userName, giftName)
        self.send(msg)

    '''记录没有处理的数据'''
    def undeal(self, json):
        self.db.ladd(self.unkey,json)
    def talk(self):
        pass
